package br.uece.comp.paa.gui.action;

import java.awt.event.ActionEvent;
import java.text.DecimalFormat;
import java.util.List;

import javax.swing.JOptionPane;

import br.uece.comp.paa.ProjetoApp;
import br.uece.comp.paa.entity.Aleatorio;
import br.uece.comp.paa.entity.Exaustiva;
import br.uece.comp.paa.entity.GeradorArvoreMinima;
import br.uece.comp.paa.entity.Kruskal;
import br.uece.comp.paa.entity.LasVegas;
import br.uece.comp.paa.entity.Prim;
import br.uece.comp.paa.entity.beb.BranchAndBound;
import br.uece.comp.paa.entity.grafo.Grafo;
import br.uece.comp.paa.entity.param.Retorno;
import br.uece.comp.paa.entity.ts.BuscaTabu;
import br.uece.comp.paa.gui.RelatorioAGMPanel;
import br.uece.comp.paa.util.ExecucaoThread;

/**
 * Gera o reltório a partir dos dados enviados pela GUI.
 * 
 * @author juliano
 * 
 */
public class GerarRelatorioAction extends DefaultAction {

	private static List<Retorno> agms;

	public static ExecucaoThread t;

	@Override
	public void actionPerformed(ActionEvent e) {

		RelatorioAGMPanel panel = ProjetoApp.app.getPrincipal()
				.getRelatorioAGMPanel();

		int grauMaximo, qtdArvoreMaximo;
		double custoMaximo;

		String opcao = panel.getComboAlgoritmo().getSelectedItem().toString();
		panel.getTextPane().setText("");

		GeradorArvoreMinima gerador = null;
		Grafo g = ProjetoApp.app.getGrafo();
		if (opcao.equals("Las Vegas")) {
			gerador = new LasVegas(g);
		} else if (opcao.equals("Branch and Bound")) {
			gerador = new BranchAndBound(g);
		} else if (opcao.equals("Prim")) {
			gerador = new Prim(g);
		} else if (opcao.equals("Busca Tabu")) {
			gerador = new BuscaTabu(g);
		} else if (opcao.equals("Exaustiva")) {
			gerador = new Exaustiva(g);
		} else if (opcao.equals("Aleatorio")) {
			gerador = new Aleatorio(g);
		} else {
			gerador = new Kruskal(g);
		}

		grauMaximo = panel.getGrauMaximo();
		qtdArvoreMaximo = panel.getQtdArvoreMaximo();
		custoMaximo = panel.getCustoMaximo();

		if (grauMaximo >= 2) {

			if (opcao.equals("Branch and Bound") || opcao.equals("Exaustiva")) {
				t = new ExecucaoThread(gerador, grauMaximo,
						qtdArvoreMaximo, custoMaximo, panel);
				t.start();
				System.out.println("segue...");

			} else {
				agms = gerador.gerar(grauMaximo, qtdArvoreMaximo, custoMaximo);

				String msg = "ALGORITMO " + opcao;
				for (int i = 0; i < agms.size(); i++) {
					msg += '\n' + "AGM Nº " + (i + 1);
					msg += '\n' + "Tempo total de geraço: "
							+ agms.get(i).resultado.getTempo();
					msg += '\n'
							+ "Custo da solução: "
							+ new DecimalFormat().format(agms.get(i).resultado
									.getCusto()) + '\n';
				}

				msg += '\n' + "Clique em EXIBIR para verificar a árvore nº 1 graficamente sobre o grafo!";

				panel.getTextPane().setText(msg);

				ProjetoApp.app.setAgms(agms);
			}
		} else {
			JOptionPane
					.showMessageDialog(ProjetoApp.app.getPrincipal(),
							"Não é possível gerar uma árvore com restrição de grau inferior a 2");
		}
	}
}
